import React, { PureComponent, Fragment } from 'react';
import { Table, Alert, Divider } from 'antd';
import styles from './index.less';

function initTotalList(columns) {
    const totalList = [];
    columns.forEach((column) => {
        if (column.needTotal) {
            totalList.push({ ...column, total: 0 });
        }
    });
    return totalList;
}

class StandardTable extends PureComponent {
    constructor(props) {
        super(props);
        const { columns } = props;
        const needTotalList = initTotalList(columns);
        this.state = {
            selectedRowKeys: [],
            needTotalList,
        };
    }

    componentWillReceiveProps(nextProps) {
        // clean state
        if (nextProps.selectedRows.length === 0) {
            const needTotalList = initTotalList(nextProps.columns);
            this.setState({
                selectedRowKeys: [],
                needTotalList,
            });
        }
    }

    handleRowSelectChange = (selectedRowKeys, selectedRows) => {
        let needTotalList = [...this.state.needTotalList];
        needTotalList = needTotalList.map((item) => {
            return {
                ...item,
                total: selectedRows.reduce((sum, val) => {
                    return sum + parseFloat(val[item.dataIndex], 10);
                }, 0),
            };
        });

        if (this.props.onSelectRow) {
            this.props.onSelectRow(selectedRows);
        }

        this.setState({ selectedRowKeys, needTotalList });
    };

    handleTableChange = (pagination, filters, sorter) => {
        this.props.onChange(pagination, filters, sorter);
    };

    cleanSelectedKeys = () => {
        this.handleRowSelectChange([], []);
    };

    render() {
        const { selectedRowKeys, needTotalList } = this.state;
        const { data: { content, page, size, totalElements }, loading, columns, scroll, searchForm, tableSize, showHeader } = this.props;
        const paginationProps = {
            showSizeChanger: true,
            showQuickJumper: true,
            current: page,
            pageSize: size,
            total: totalElements,
            searchForm,
        };

        const rowSelection = {
            selectedRowKeys,
            onChange: this.handleRowSelectChange,
            getCheckboxProps: record => ({
                disabled: record.disabled,
            }),
        };

        return (
            <div className={styles.standardTable}>
                {/* <div className={styles.tableAlert}>
                    <Alert
                        message={
                            <Fragment>
                                已选择 <a style={{ fontWeight: 600 }}>{selectedRowKeys.length}</a>{' '}
                                项
                                <a onClick={this.cleanSelectedKeys} style={{ marginLeft: 24 }}>
                                    清空
                                </a>
                            </Fragment>
                        }
                        type="info"
                        showIcon
                    />
                </div> */}
                {tableSize ? '' : <Divider />}
                {scroll ? <Table
                    loading={loading}
                    rowKey={record => record.id}
                    showHeader={showHeader}
                    rowSelection={rowSelection}
                    dataSource={content}
                    columns={columns}
                    scroll={scroll}
                    size={tableSize}
                    pagination={paginationProps}
                    onChange={this.handleTableChange}
                /> : <Table
                    loading={loading}
                    rowKey={record => record.id}
                    showHeader={showHeader}
                    dataSource={content}
                    columns={columns}
                    size={tableSize}
                    pagination={paginationProps}
                    onChange={this.handleTableChange}
                />}
            </div>
        );
    }
}

export default StandardTable;
